/*************************************************************************
	> File Name: oj-51.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2021年01月10日 星期日 19时09分14秒
 ************************************************************************/
#include <iostream>
using namespace std;
#define MAX_N 1000
#define MOD_NUM 100007

int s[MAX_N + 5], t; //单调栈，保存离当前x点最近的比它矮的矩形下标
int c[MAX_N + 5][MAX_N + 5];//每个点向上数有几个连续的白色格子
int f[MAX_N + 5]; //当前x点可以组成的全白子矩形数量
int n, m;

long long solve() {
    long long ans = 0;
    for (int i = 1; i <= n; ++i) {
        t = -1; /*初始化单调栈*/
        s[++t] = 0;
        c[i][0] = -1; /*虚拟的0位置*/
        f[0] = 0;
        for (int j = 1; j <= m; ++j) {
            while (t != -1 && c[i][s[t]] >= c[i][j]) --t;
            //将不符合单调栈规律的元素出栈
            f[j] = c[i][j] * (j - s[t]) + f[s[t]];
            //更新f[j]为栈顶元素（最近的比它矮的矩形下标）
            s[++t] = j; //更新单调栈
            f[j] %= MOD_NUM;
            ans += f[j];
            ans %= MOD_NUM;
        }
    }
    return ans;
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> c[i][j];
            if (c[i][j]) c[i][j] += c[i - 1][j];
        }
    }
    cout << solve() << endl;
    return 0;
}
